package cn.com.landsky.camera.common.utils;

import cn.com.landsky.camera.common.enums.ICommonEnum;

import java.util.ArrayList;
import java.util.List;

/***
 ** @category 枚举工具类(这里需要注意的是所有枚举类必须实现ICommonEnum接口)...
 ** @author qing.yunhui
 ** @email: qingyunhui@landsky.cn
 ** @createTime:2018-12-12 10:07
 **/
public class EnumUtil {
    /**
     * 根据给定code获取Value
     * @param clzs  枚举类
     * @param code 枚举code
     * @return String 枚举Value
     * */
    public static String getValueByCode(Class<?> clzs,Object code){
        ICommonEnum[] commonEnums=getICommonEnums(clzs);
        if(StringUtil.isEmptys(commonEnums,code)){return null;}
        for(ICommonEnum commonEnum:commonEnums){
            if(code.equals(commonEnum.getCode())){
                return commonEnum.getValue();
            }
        }
        return null;
    }

    /**
     * 根据给定key获取Value
     * @param clzs  枚举类
     * @param key 枚举key
     * @return String 枚举Value
     * */
    public static String getValueByKey(Class<?> clzs,String key){
        ICommonEnum[] commonEnums=getICommonEnums(clzs);
        if(null==commonEnums) {return null;}
        for(ICommonEnum ienum:commonEnums){
            if(ienum.getKey().equals(key)){
                return ienum.getValue();
            }
        }
        return null;
    }

    /**
     * <p>根据给定key获取value</p>
     * @param clzs 枚举类
     * @param key 枚举key
     * @return 枚举value
     * */
    public static String getValueByKey(String clzs,String key){
        try {
            return getValueByKey(Class.forName(clzs), key);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * <p>根据给定key查询对应的枚举对象</p>
     * @param clzs 枚举类
     * @param key  枚举key
     * @return
     * */
    public static ICommonEnum getEnumByKey(Class<?> clzs,String key){
        ICommonEnum[] commonEnums=getICommonEnums(clzs);
        if(null==commonEnums){ return null;}
        if(null==key){return null;}
        for(ICommonEnum ienum:commonEnums){
            if(ienum.getKey().equals(key)){
                return ienum;
            }
        }
        return null;
    }

    /**
     * 根据给定Valuee获取code
     * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
     * @param value 枚举value
     * @return String 枚举code
     * */
    public static Integer getCodeByValue(Class<?> clzs,String value){
        ICommonEnum[] commonEnums=getICommonEnums(clzs);
        if(null==commonEnums) {return null;}
        for(ICommonEnum ienum:commonEnums){
            if(ienum.getValue().equals(value)){
                return ienum.getCode();
            }
        }
        return null;
    }

    /**
     * 根据给定value获取key
     * @param clzs  枚举类 (该枚举类必须实现ICommonEnum接口)
     * @param value 枚举value
     * @return String 枚举key
     * */
    public static String getKeyByValue(Class<?> clzs,String value){
        ICommonEnum[] commonEnums=getICommonEnums(clzs);
        if(null==commonEnums) {return null;}
        for(ICommonEnum ienum:commonEnums){
            if(ienum.getValue().equals(value)){
                return ienum.getKey();
            }
        }
        return null;
    }

    /**
     * <p>根据给定枚举类得到该枚举类所有的keys集合</p>
     * @param clzs
     * @return
     * */
    public static List<String> getCodesByClz(Class<?> clzs){
        ICommonEnum[] enums=getICommonEnums(clzs);
        List<String> result=new ArrayList<>();
        for(ICommonEnum em:enums){
            if(StringUtil.isNotEmptys(em.getCode())){
                result.add(em.getCode().toString());
            }
        }
        return result;
    }

    /**
     * <p>根据给定枚举类得到该枚举类所有的keys集合</p>
     * @param clzs
     * @return
     * */
    public static List<String> getKeysByClz(Class<?> clzs){
        ICommonEnum[] enums=getICommonEnums(clzs);
        List<String> result=new ArrayList<>();
        for(ICommonEnum em:enums){
            result.add(em.getKey());
        }
        return result;
    }

    public static ICommonEnum[] getICommonEnums(Class<?> clzs){
        ICommonEnum[] commonEnums=null;
        try {
            commonEnums=(ICommonEnum[]) getEnumConstants(clzs);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return commonEnums;
    }

    private static Object[] getEnumConstants(Class<?> clzs){
        Object[] objs=null;
        if(clzs.isEnum()){
            objs=clzs.getEnumConstants();
        }
        return objs;
    }

    /**
     * 根据code 获取ICommonEnum
     * @param clzs  枚举类(该枚举类必须实现ICommonEnum接口)
     * @param code 枚举code
     * @return ICommonEnum 枚举
     * */
    public static ICommonEnum getEnumByCode(Class<?> clzs,String code){
        ICommonEnum[] commonEnums = getICommonEnums(clzs);
        if(null == commonEnums) {return null;}
        if(StringUtil.isEmpty(code)){return null;}
        for(ICommonEnum ienum : commonEnums){
            if(code.equals(ienum.getCode())){
                return ienum;
            }
        }
        return null;
    }

}
